#include <iostream>

#include <gtest/gtest.h>
#include <amo/ascii.hpp>


TEST(ascii, test) {

    ASSERT_EQ(amo::ascii::is_valid('c'), true);
    ASSERT_EQ(amo::ascii::is_valid('\0'), true);
    ASSERT_EQ(amo::ascii::is_valid('\t'), true);
    ASSERT_EQ(amo::ascii::is_valid('1'), true);
    ASSERT_EQ(amo::ascii::is_valid(127), true);
    ASSERT_EQ(amo::ascii::is_valid((char)227), false);
    ASSERT_EQ(amo::ascii::is_valid((char) - 3), false);
    
    ASSERT_EQ(amo::ascii::is_lower('c'), true);
    ASSERT_EQ(amo::ascii::is_lower('a'), true);
    ASSERT_EQ(amo::ascii::is_lower('A'), false);
    ASSERT_EQ(amo::ascii::is_lower('\0'), false);
    ASSERT_EQ(amo::ascii::is_lower('\t'), false);
    ASSERT_EQ(amo::ascii::is_lower('1'), false);
    ASSERT_EQ(amo::ascii::is_lower(127), false);
    ASSERT_EQ(amo::ascii::is_lower((char)227), false);
    ASSERT_EQ(amo::ascii::is_lower((char) - 3), false);
    
    ASSERT_EQ(amo::ascii::is_upper('c'), false);
    ASSERT_EQ(amo::ascii::is_upper('a'), false);
    ASSERT_EQ(amo::ascii::is_upper('A'), true);
    ASSERT_EQ(amo::ascii::is_upper('\0'), false);
    ASSERT_EQ(amo::ascii::is_upper('\t'), false);
    ASSERT_EQ(amo::ascii::is_upper('1'), false);
    ASSERT_EQ(amo::ascii::is_upper(127), false);
    ASSERT_EQ(amo::ascii::is_upper((char)227), false);
    ASSERT_EQ(amo::ascii::is_upper((char) - 3), false);
    
    ASSERT_EQ(amo::ascii::is_alpha('c'), true);
    ASSERT_EQ(amo::ascii::is_alpha('a'), true);
    ASSERT_EQ(amo::ascii::is_alpha('A'), true);
    ASSERT_EQ(amo::ascii::is_alpha('\0'), false);
    ASSERT_EQ(amo::ascii::is_alpha('\t'), false);
    ASSERT_EQ(amo::ascii::is_alpha('1'), false);
    ASSERT_EQ(amo::ascii::is_alpha(127), false);
    ASSERT_EQ(amo::ascii::is_alpha((char)227), false);
    ASSERT_EQ(amo::ascii::is_alpha((char) - 3), false);
    
    ASSERT_EQ(amo::ascii::is_digit('c'), false);
    ASSERT_EQ(amo::ascii::is_digit('a'), false);
    ASSERT_EQ(amo::ascii::is_digit('A'), false);
    ASSERT_EQ(amo::ascii::is_digit('\0'), false);
    ASSERT_EQ(amo::ascii::is_digit('\t'), false);
    ASSERT_EQ(amo::ascii::is_digit('1'), true);
    ASSERT_EQ(amo::ascii::is_digit(127), false);
    ASSERT_EQ(amo::ascii::is_digit((char)227), false);
    ASSERT_EQ(amo::ascii::is_digit((char) - 3), false);
    
    ASSERT_EQ(amo::ascii::is_alpha_number('c'), true);
    ASSERT_EQ(amo::ascii::is_alpha_number('a'), true);
    ASSERT_EQ(amo::ascii::is_alpha_number('A'), true);
    ASSERT_EQ(amo::ascii::is_alpha_number('\0'), false);
    ASSERT_EQ(amo::ascii::is_alpha_number('\t'), false);
    ASSERT_EQ(amo::ascii::is_alpha_number('1'), true);
    ASSERT_EQ(amo::ascii::is_alpha_number(127), false);
    ASSERT_EQ(amo::ascii::is_alpha_number((char)227), false);
    ASSERT_EQ(amo::ascii::is_alpha_number((char) - 3), false);
    
    
    ASSERT_EQ(amo::ascii::is_blank(' '), true);
    ASSERT_EQ(amo::ascii::is_blank(char(9)), true);
    ASSERT_EQ(amo::ascii::is_blank('A'), false);
    ASSERT_EQ(amo::ascii::is_blank('\0'), false);
    ASSERT_EQ(amo::ascii::is_blank('1'), false);
    ASSERT_EQ(amo::ascii::is_blank(127), false);
    ASSERT_EQ(amo::ascii::is_blank((char)227), false);
    ASSERT_EQ(amo::ascii::is_blank((char) - 3), false);
    
    
    ASSERT_EQ(amo::ascii::is_space(' '), true);
    ASSERT_EQ(amo::ascii::is_space('a'), false);
    ASSERT_EQ(amo::ascii::is_space('A'), false);
    ASSERT_EQ(amo::ascii::is_space('\0'), false);
    ASSERT_EQ(amo::ascii::is_space('\t'), true);
    ASSERT_EQ(amo::ascii::is_space('1'), false);
    ASSERT_EQ(amo::ascii::is_space(127), false);
    ASSERT_EQ(amo::ascii::is_space((char)227), false);
    ASSERT_EQ(amo::ascii::is_space((char) - 3), false);
    
    ASSERT_EQ(amo::ascii::is_control((char)1), true);
    ASSERT_EQ(amo::ascii::is_control((char)2), true);
    ASSERT_EQ(amo::ascii::is_control('A'), false);
    ASSERT_EQ(amo::ascii::is_control('\0'), true);
    ASSERT_EQ(amo::ascii::is_control('\t'), true);
    ASSERT_EQ(amo::ascii::is_control('1'), false);
    ASSERT_EQ(amo::ascii::is_control(127), true);
    ASSERT_EQ(amo::ascii::is_control((char)227), false);
    ASSERT_EQ(amo::ascii::is_control((char) - 3), false);
    
    
    ASSERT_EQ(amo::ascii::is_punct('#'), true);
    ASSERT_EQ(amo::ascii::is_punct('!'), true);
    ASSERT_EQ(amo::ascii::is_punct('$'), true);
    ASSERT_EQ(amo::ascii::is_punct('\0'), false);
    ASSERT_EQ(amo::ascii::is_punct('\t'), false);
    ASSERT_EQ(amo::ascii::is_punct('1'), false);
    ASSERT_EQ(amo::ascii::is_punct(127), false);
    ASSERT_EQ(amo::ascii::is_punct((char)227), false);
    ASSERT_EQ(amo::ascii::is_punct((char) - 3), false);
    
    
    ASSERT_EQ(amo::ascii::is_hex_digit('A'), true);
    ASSERT_EQ(amo::ascii::is_hex_digit('a'), true);
    ASSERT_EQ(amo::ascii::is_hex_digit('3'), true);
    ASSERT_EQ(amo::ascii::is_hex_digit('\0'), false);
    ASSERT_EQ(amo::ascii::is_hex_digit('\t'), false);
    ASSERT_EQ(amo::ascii::is_hex_digit('1'), true);
    ASSERT_EQ(amo::ascii::is_hex_digit(127), false);
    ASSERT_EQ(amo::ascii::is_hex_digit((char)227), false);
    ASSERT_EQ(amo::ascii::is_hex_digit((char) - 3), false);
    
    
    ASSERT_EQ(amo::ascii::is_graph('A'), true);
    ASSERT_EQ(amo::ascii::is_graph('a'), true);
    ASSERT_EQ(amo::ascii::is_graph('3'), true);
    ASSERT_EQ(amo::ascii::is_graph('\0'), false);
    ASSERT_EQ(amo::ascii::is_graph('\t'), false);
    ASSERT_EQ(amo::ascii::is_graph('1'), true);
    ASSERT_EQ(amo::ascii::is_graph(127), false);
    ASSERT_EQ(amo::ascii::is_graph((char)227), false);
    ASSERT_EQ(amo::ascii::is_graph((char) - 3), false);
    
    ASSERT_EQ(amo::ascii::is_print('A'), true);
    ASSERT_EQ(amo::ascii::is_print('a'), true);
    ASSERT_EQ(amo::ascii::is_print('3'), true);
    ASSERT_EQ(amo::ascii::is_print('\0'), false);
    ASSERT_EQ(amo::ascii::is_print('\t'), false);
    ASSERT_EQ(amo::ascii::is_print('1'), true);
    ASSERT_EQ(amo::ascii::is_print(127), false);
    ASSERT_EQ(amo::ascii::is_print((char)227), false);
    ASSERT_EQ(amo::ascii::is_print((char) - 3), false);
    
    
    ASSERT_EQ(amo::ascii::to_ascii('A'), 'A');
    ASSERT_EQ(amo::ascii::to_ascii('a'), 'a');
    ASSERT_EQ(amo::ascii::to_ascii('3'), '3');
    ASSERT_EQ(amo::ascii::to_ascii('A' + 128), 'A');
    
    ASSERT_EQ(amo::ascii::to_lower('A'), 'a');
    ASSERT_EQ(amo::ascii::to_lower('a'), 'a');
    ASSERT_EQ(amo::ascii::to_lower('3'), '3');
    
    ASSERT_EQ(amo::ascii::to_upper('A'), 'A');
    ASSERT_EQ(amo::ascii::to_upper('a'), 'A');
    ASSERT_EQ(amo::ascii::to_upper('3'), '3');
    
    
}